#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import lxml.etree as etree
import json
import argparse

def export_testcases_json(report, path):
    with open(os.path.join(path, "cases.jer"), "w") as testcases_file:
        for testsuite in report.getroot():
            for testcase in testsuite:
                row = {}
                row["hostname"] = testsuite.get("hostname")
                row["suite"] = testsuite.get("name")
                row["suite_duration"] = testsuite.get("time")
                row["timestamp"] = testsuite.get("timestamp")
                row["testname"] = testcase.get("name")
                row["classname"] = testcase.get("classname")
                row["file"] = testcase.get("file")
                row["line"] = testcase.get("line")
                row["duration"] = testcase.get("time")
                for el in testcase:
                    if el.tag == "system-err":
                        row["stderr"] = el.text
                    else:
                        row["stderr"] = ""

                    if el.tag == "system-out":
                        row["stdout"] = el.text
                    else:
                        row["stdout"] = ""

                json.dump(row, testcases_file)
                testcases_file.write("\n")

def export_testsuites_json(report, path):
    with open(os.path.join(path, "suites.jer"), "w") as testsuites_file:
        for testsuite in report.getroot():
            row = {}
            row["suite"] = testsuite.get("name")
            row["errors"] = testsuite.get("errors")
            row["failures"] = testsuite.get("failures")
            row["hostname"] = testsuite.get("hostname")
            row["skipped"] = testsuite.get("skipped")
            row["duration"] = testsuite.get("time")
            row["timestamp"] = testsuite.get("timestamp")
            json.dump(row, testsuites_file)
            testsuites_file.write("\n")


def _convert_junit_to_html(junit_path, result_path, export_cases, export_suites):
    with open(os.path.join(os.path.dirname(__file__), "junit-noframes.xsl")) as xslt_file:
        junit_to_html_xslt = etree.parse(xslt_file)
        if not os.path.exists(result_path):
            os.makedirs(result_path)

        with open(junit_path) as junit_file:
            junit_xml = etree.parse(junit_file)

            if export_suites:
                export_testsuites_json(junit_xml, result_path)
            if export_cases:
                export_testcases_json(junit_xml, result_path)
            transform = etree.XSLT(junit_to_html_xslt)
            html = etree.tostring(transform(junit_xml), encoding="utf-8")

            with open(os.path.join(result_path, "result.html"), "w") as html_file:
                html_file.write(html)

if __name__ == "__main__":

    parser = argparse.ArgumentParser(description='Convert JUnit XML.')
    parser.add_argument('junit', help='path to junit.xml report')
    parser.add_argument('result_dir', nargs='?', help='directory for result files. Default to junit.xml directory')
    parser.add_argument('--export-cases', help='Export JSONEachRow result for testcases to upload in CI', action='store_true')
    parser.add_argument('--export-suites', help='Export JSONEachRow result for testsuites to upload in CI', action='store_true')

    args = parser.parse_args()

    junit_path = args.junit
    if args.result_dir:
        result_path = args.result_dir
    else:
        result_path = os.path.dirname(junit_path)
    print "junit_path: {}, result_path: {}, export cases:{}, export suites: {}".format(junit_path, result_path, args.export_cases, args.export_suites)
    _convert_junit_to_html(junit_path, result_path, args.export_cases, args.export_suites)
